Skip to main content

고정 소수점 & 부동 소수점

컴퓨터에서의 실수 표현

컴퓨터에서는 실수를 2진수로만 표현해야 하기 때문에 정수에 비해서 표현하기가 훨씬 복잡하다.

이에 따라 실수를 표현하기 위한 여러가지 방법들이 연구되었으며, 지금 주로 사용하는 방식은 2가지이다.

  1. 고정 소수점(fixed point) 방식
  2. 부동 소수점(floating point) 방식

이진 기수법

컴퓨터는 0과 1로 이루어진 기계어를 사용한다. 사람들은 수를 표현할 때 기본적으로 10진법을 사용하는데, 컴퓨터에 이를 저장하려면 2진법으로 저장을 해야한다. 실수는 보통 정수부와 실수부, 이 2가지 부분으로 나눌 수 있다.

우선 정수 부분을 2진법으로 변환하는 법은 간단하다.

이진 기수법

위의 사진처럼 정수 부분을 2로 계속 나누어주면 된다.

10진법 35는 2진법으로 바꾸게 되면 100011(2)가 되는 것이다.

소수 부분을 2진법으로 변환하는 법은 남은 숫자에 * 2를 해주는 방법이다.

0.625를 이진수로 변환해보자.

0.625 * 2 = 1.25 ==> 1을 빼내고 나머지 0.25

0.25 * 2 = 0.5 ==> 0을 빼내고 나머지 0.5

0.5 * 2 = 1.0 ==> 1을 빼내고 나머지 0

나머지가 0이 나오게 되면 변환을 종료한다.

0.625 ==> 0.101(2)이 되게 된다.

고정 소수점(fixed point) 방식

실수를 표현하는 가장 간단한 방식은 소수부의 자릿수를 미리 정하고 고정된 자릿수의 소수를 표현하는 것이다. 그 것이 바로 고정소수점 방식이다.

고정 소수점

32비트 실수를 고정 소수점 방식으로 표현하면 위 사진과 같다.

앞에 부호비트 1개를 두고 정수부 15비트, 소수부 16비트를 두게 된다.

이 방식은 정수부와 소수부의 자릿수가 크지 않아서 표현할 수 있는 범위가 매우 적다는 단점이 있다.

부동 소수점(floating point) 방식

실수를 가수부와 지수부로 나누어 표현할 수도 있는데 이 방식이 부동 소수점 방식이다. 대부분의 시스템에서 부동 소수점 방식으로 실수를 표현하고 있다.

고정 소수점 방식은 표현할 수 있는 범위가 매우 작지만 부동 소수점 방식을 사용하게 되면 매우 큰 실수까지 표현가능하다.

32비트에서의 공식은 다음과 같다.

±(1.가수부)2지수부127\pm(1.가수부) * 2^{지수부-127}

IEEE 부동 소수점 방식

현재는 대부분 IEEE 754 표준을 따르고 있다.

32비트 부동 소수점

32비트인 float형 실수를 IEEE 부동 소수점 방식을 사용하여 표현하면 위 사진과 같다.

64비트 부동 소수점

64비트인 double형 실수를 IEEE 부동 소수점 방식을 사용하여 표현하면 위 사진과 같다.

이제 -142.5625를 32비트 부동소수점으로 변환해보자.

  1. 부호부 지정하기 (음수 1, 양수 0)
  2. 숫자의 절댓값을 이진법으로 표현 (142.5625 ==> 10001110.1001)
  3. 소수점을 이동시켜 소수점 왼쪽에 1 한개만 남도록 변환 (10001110.1001 ==> 1.00011101001*2^{7})
  4. 소수점을 제거하고 가수부의 비트수에 맞춰 부족한만큼 0으로 채워 가수부 완성 (10001110100100000000000)
  5. 지수는 7이므로 bias에 7을 더해 이진법으로 표현하여 지수부 완성 (32비트에서 bias=127 ==> 10000110)
  6. 이 모든것을 이어붙이기 (1 10000110 10001110100100000000000)
tip

bias란 부호부를 가지지 않는 지수부가 음수가 되지 않도록 보정해주는 값 (32비트에서 지수부는 8자리 이므로 128에서 1을 뺀 127이 Bias가 된다.)

우리가 부동 소수점 방식에서 bias를 사용하는 이유는 지수가 음수가 될 수도 있기 때문이다.

예를 들어 1보다 작은 0.000101이라는 이진수를 사용하려고 하면 1.01*2^{-4}가 된다. -4를 저장하려고 부호부를 또 만들수는 없으므로 bias를 사용해야만 한다.

부동 소수점의 단점

  • 아직 정밀도 문제가 존재하기 때문에 컴퓨터에서 실수를 다룰 때 연산이 오차를 가질 수 있다.

나올 수 있는 면접 질문

  • 고정 소수점과 부동 소수점이란?
  • 부동 소수점을 사용하여 10진수를 변환하는 방법은?
  • bias를 사용하는 이유는?

참고 url

위키백과 - 부동소수점 정의

TCPSCHOOL - 부동소수점 방식

메시에 - 컴퓨터에서의 실수 표현

3초2분1년 - 고정소수점과 부동소수점

기여자


HelloNaks

📦